﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;

namespace Iudicium.Persona.CRN
{
    /// <summary>
    /// Descripción breve de PersonaNaturalCLR
    /// </summary>
    public class PersonaNaturalCRN
    {
        private static readonly ILog log = LogManager.GetLogger("LogFile");

        public PersonaNaturalCRN()
        {
            //
            // TODO: Agregar aquí la lógica del constructor
            //
        }

        public static int InsertPersonaNatural(PersonaNatural objPersona)
        {
            if (objPersona == null)
            {
                throw new ArgumentException("La persona no puede ser nula.");
            }
            if (string.IsNullOrEmpty(objPersona.Nombre))
            {
                throw new ArgumentException("El nombre de la persona no puede ser nulo o vacio");
            }
            if (string.IsNullOrEmpty(objPersona.Cedula))
            {
                throw new ArgumentException("La Cedula de la persona no puede ser nulo o vacio");
            }
            if (string.IsNullOrEmpty(objPersona.ExpedicionCedula))
            {
                throw new ArgumentException("La ExpedicionCedula de la persona no puede ser nulo o vacio");
            }
            if (string.IsNullOrEmpty(objPersona.Sexo))
            {
                throw new ArgumentException("El Sexo de la persona no puede ser nulo o vacio");
            }

            int? personaId = 0;

            PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter adpater =
                new PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter();

            adpater.Insert(ref personaId, objPersona.Nombre, objPersona.Cedula, objPersona.Sexo, objPersona.ExpedicionCedula);

            if (personaId == null || personaId.Value == 0)
            {
                throw new Exception("La sentencia SQL se ejecuto correctamente pero no se genero la llave primaria.");
            }

            return personaId.Value;
        }

        public static void UpdatePersonaNatural(PersonaNatural objPersona)
        {
            if (objPersona == null)
            {
                throw new ArgumentException("La persona no puede ser nula.");
            }
            if (objPersona.PersonaId <= 0)
            {
                throw new ArgumentException("personaId no puede ser menor o igual que cero.");
            }
            if (string.IsNullOrEmpty(objPersona.Nombre))
            {
                throw new ArgumentException("El nombre de la persona no puede ser nulo o vacio");
            }
            if (string.IsNullOrEmpty(objPersona.Cedula))
            {
                throw new ArgumentException("La Cedula de la persona no puede ser nulo o vacio");
            }
            if (string.IsNullOrEmpty(objPersona.ExpedicionCedula))
            {
                throw new ArgumentException("La ExpedicionCedula de la persona no puede ser nulo o vacio");
            }
            if (string.IsNullOrEmpty(objPersona.Sexo))
            {
                throw new ArgumentException("El Sexo de la persona no puede ser nulo o vacio");
            }

            PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter adpater =
                new PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter();

            adpater.Update(objPersona.PersonaId, objPersona.Nombre, objPersona.Cedula, objPersona.Sexo, objPersona.ExpedicionCedula);
        }

        public static void DeletePersonaNaturalbyId(int personaId)
        {
            if (personaId <= 0)
            {
                throw new ArgumentException("personaId no puede ser menor o igual que cero.");
            }

            PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter adpater =
                new PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter();

            adpater.Delete(personaId);
        }

        public static PersonaNatural GetPersonaNaturalById(int personaId)
        {
            if (personaId <= 0)
            {
                throw new ArgumentException("personaId no puede ser menor o igual que cero.");
            }

            PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter adpater =
                new PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter();

            PersonaNaturalDS.PersonaNaturalDataTable tabla =
                adpater.GetPersonaNaturalById(personaId);

            if (tabla == null || tabla.Rows.Count == 0)
            {
                throw new Exception("No se pudo obtener la persona " + personaId + " de la base de datos");
            }
            return ConstruirPersona(tabla[0]);
        }

        public static List<PersonaNatural> GetPersonaNaturalBySearch(string parametro)
        {
            List<PersonaNatural> lista = new List<PersonaNatural>();

            PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter adpater =
                new PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter();

            PersonaNaturalDS.PersonaNaturalDataTable tabla =
                adpater.GetPersonaNaturalBySearch(parametro);

            if (tabla == null)
            {
                throw new Exception("No se pudo obtener resultados de la busqueda con el parametro " +
                    parametro +
                    " de la base de datos");
            }

            foreach (PersonaNaturalDS.PersonaNaturalRow row in tabla)
            {
                PersonaNatural obj = ConstruirPersona(row);
                if(obj != null)
                    lista.Add(obj);
            }
            return lista;
        }

        public static List<PersonaNatural> GetPersonaNaturalBySearch(string parametro, string ids)
        {
            List<PersonaNatural> lista = new List<PersonaNatural>();

            PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter adpater =
                new PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter();

            PersonaNaturalDS.PersonaNaturalDataTable tabla =
                adpater.GetPersonaNaturalBySearchConExcepcion(parametro,ids,"");

            if (tabla == null)
            {
                throw new Exception("No se pudo obtener resultados de la busqueda con el parametro " +
                    parametro +
                    " de la base de datos");
            }

            foreach (PersonaNaturalDS.PersonaNaturalRow row in tabla)
            {
                PersonaNatural obj = ConstruirPersona(row);
                if (obj != null)
                    lista.Add(obj);
            }
            return lista;
        }

        public static List<PersonaResultadoSimple> GetPersonaNaturalResultadoSimpleBySearch(string parametro, string ids, string nombreTabla)
        {
            if (parametro == null)
                parametro = "";

            if (ids == null)
                ids = "";

            List<PersonaResultadoSimple> lista = new List<PersonaResultadoSimple>();

            PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter adpater =
                new PersonaNaturalDSTableAdapters.PersonaNaturalTableAdapter();

            PersonaNaturalDS.PersonaNaturalDataTable tabla =
                adpater.GetPersonaNaturalBySearchConExcepcion(parametro,ids, nombreTabla);

            if (tabla == null)
            {
                throw new Exception("No se pudo obtener resultados de la busqueda con el parametro " +
                    parametro +
                    " de la base de datos");
            }

            foreach (PersonaNaturalDS.PersonaNaturalRow row in tabla)
            {
                if(row == null || row.personaNaturalId == 1)
                    continue;
                PersonaResultadoSimple obj = new PersonaResultadoSimple(row.personaNaturalId, row.nombre);
                lista.Add(obj);
            }
            return lista;
        }

        private static PersonaNatural ConstruirPersona(PersonaNaturalDS.PersonaNaturalRow row)
        {
            if (row == null)
                return null;
            return new PersonaNatural(row.personaNaturalId, row.nombre, row.cedula, row.expedicionCedula, row.sexo);
        }

    }
}
